package com.summer.media.service;

import com.summer.media.dto.QueryMediaParamsDto;
import com.summer.media.dto.UploadParamsDto;
import com.summer.media.dto.UploadResultDto;
import com.summer.media.pojo.MediaFiles;
import com.summer.model.PageParams;
import com.summer.model.PageResult;
import com.summer.model.dto.RestResponse;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;

public interface MediaFileService {

    PageResult<MediaFiles> queryMediaFiels(Long companyId, PageParams pageParams, QueryMediaParamsDto queryMediaParamsDto);

    /**
     * 上传图片等文件
     * @param companyId 机构id
     * @param uploadParamsDto 上传文件携带的参数信息（经过controller处理）
     * @param localFileName 上传文件到本地服务器临时文件中，在将临时文件上传带minio
     * @param objectName 指定上传文件的objectName，若不指定则按日期格式存入
     * @return 返回UploadResultDto（继承mediaFiles）
     */
    UploadResultDto uploadFile(Long companyId, UploadParamsDto uploadParamsDto, String localFileName, String objectName);

    /**
     * 向media_files表存入文档图片等文件信息
     * @param companyId 机构id
     * @param uploadParamsDto 插入数据
     * @param md5 文件md5
     * @param objectName 用于保存表中filePath、url字段
     * @return 返回刚插入的MediaFiles
     */
    MediaFiles insert2db(Long companyId, UploadParamsDto uploadParamsDto, String md5, String objectName);

    /**
     * 向media_files与media_process表存入视频文件信息
     * @param companyId 机构id
     * @param uploadParamsDto 插入数据
     * @param md5 文件md5
     * @param objectName 用于保存表中filePath、url字段
     * @return 返回刚插入的MediaFiles
     */
    MediaFiles insertVideo2db(Long companyId, UploadParamsDto uploadParamsDto, String md5, String objectName);

    RestResponse<Boolean> isFileExist(String fileMd5);

    RestResponse<Boolean> isBlockExist(String fileMd5, int chunk);

    RestResponse<Boolean> uploadBlockFile(String md5, int blockName, String localTemp);

    /**
     * 合并视频分块
     * @param companyId 机构id
     * @param fileMd5 源文件MD5：由前端传来
     * @param blockNum 分块数量：由前端传来，用于合并与删除分块
     * @param uploadParamsDto 文件信息，由调用者组装，用于文件信息入库
     * @return
     */
    RestResponse<Boolean> mergeBlock(Long companyId,
                                     String fileMd5,
                                     int blockNum,
                                     UploadParamsDto uploadParamsDto);

    /**
     * 从minio下载到本地临时文件
     * @param bucket 指定minio桶
     * @param objectName minio中的文件
     * @return 返回本地文件对象
     */
    public File downloadFileFromMinIOToLocalTemp(String bucket, String objectName);

    // 上传文件到minio, true上传成功，否则失败
    public boolean upload2minio(String bucket, String localFileName, String mimeType, String objectName);

    MediaFiles getFileById(String mediaId);
}
